﻿Особенности FP
admin|2009/01/05 16:50:33
##PAGE##
{TOC}


===Функциональное и императивное программирование===
Чтобы получить более детальное представление о некоторых недостатках языков фон Неймана, сравним обычную программу вычисления внутреннего произведения с соответствующей функциональной программой, рассмотренной нами ранее. 

====Программа фон Неймана для внутреннего произведения====
'''с:=0;

for i:= 1 step 1 until n do

с:= c+a<<nowiki>esc>[i]</esc> </nowiki>× b<nowiki>[i]</nowiki>;'''

Заслуживают упоминания следующие свойства этой программы. 

*Ее операторы действуют на скрытые “состояния” в соответствии со сложными правилами. 
*Она не является иерархической. За исключением правой части оператора присваивания, она не конструирует сложных объектов из более простых. (Впрочем, большие программы часто делают это.) 
*Она динамическая и итеративная. Человек должен мысленно исполнить ее, чтобы понять ее работу. 
*Она проводит вычисления пословно, повторяя (присваивание) и модифицируя (переменную i). 
*Часть данных (число n) содержится в программе; по этому ей недостает общности и она работает только с векторами длины n. 
*Она именует свои аргументы; ее можно использовать только для векторов а и b. Чтобы она стала общей, требуется описание процедуры. При этом возникают сложные проблемы; (например, вызов по имени вместо вызова по значению). 
*Ее операции "внутреннего хозяйства"представляются: символами, помещенными в разных местах (в операторе for и в индексах оператора присваивания). Из-за этого невозможно сосредоточить операции внутреннего хозяйства, которые являются наиболее общими из всех операций, в единых, мощных,. широко используемых операциях. Таким образом, при программировании таких операций всегда приходится начинать снова "в лоб выписывая “for i :=...” и “for j :=…”, а затем операторы присваивания, пестрящие индексами i и j.

====Функциональная программа для скалярного произведения====
 Рассмотрим уже знакомую нам функциональную программу для скалярного произведения. 

<math>\text{Def} IP = (\setminus +)\circ (\alpha \times) \circ trans </math>
 
В синтаксисе встроенного интерпретатора она будет записана вот так:
<fpcode>Def IP = /+ o @* o transpose</fpcode>

Сравним свойства этой программы со свойствами программы фон Неймана. 
*Она оперирует только своими аргументами. Здесь нет скрытых состояний или сложных правил перехода. Имеются только два вида правил, одно для применения функции к ее аргументу, а другое для получения функции, обозначаемой та кой функциональной формой, как композиция f ∘ g или Применить ко всем, αf, если известны параметры форм, т. е. функции f и g. 
*Она является иерархической, поскольку строится из трех более простых функций (+, ×, trans) и трех функциональных форм f ∘ g, αf и ∕f. 
*Она является статической и неитеративной в том смысле, что ее структура удобна для ее понимания без мысленного исполнения. Например, если некто понимает действие форм f ∘ g и αf и функций × и trans, то он понимает действие α× и (α×) ∘ trans и т. д. 
*Она оперирует целыми концептуальными блоками, а не словами; она состоит из трех этапов, ни один этап не повторяется. 
*Она не включает данных; она является вполне общей; она работает для любой пары векторов одинаковой размерности. 
*Она не именует свои аргументы; она применима к любой паре векторов без всяких описаний процедур или сложных правил подстановок. 
*Она использует формы и функции внутреннего хозяйства, которые универсально полезны во многих других программах; на самом деле только операции + и × не имеют от ношения к внутреннему хозяйству. Эти формы и функции могут комбинироваться с другими, создавая операции внутреннего хозяйства более высокого уровня.


===Системы FP как язык программирования===
Системы FP столь компактны, что для некоторых читателей может оказаться затруднительной их интерпретация как языков программирования. При такой интерпретации функция f является программой, объект x представляет собой содержимое памяти, a f : x - это содержимое памяти после активации программы f, когда в памяти находится x. Множество определений представляет собой библиотеку программ. Обеспечиваемые системой примитивные функции и функциональные формы являются базовыми операторами конкретного языка программирования. Итак, в зависимости от выбора примитивных функций и функциональных -форм структура FP обеспечивает большой класс языков с различными стилями и возможностями. Ассоциированная с каждым из этих языков алгебра программ зависит от конкретного набора функциональных форм. Представленные примитивные функции, функциональные формы и программы заключают в себе попытку разработать один из таких возможных стилей. 


===Ограничения систем FP===
Системы FP характеризуются рядом ограничений.

*Например, заданная система FP представляет собой фиксированный язык, она не является исторически чувствительной: ни одна программа не в состоянии изменить библиотеку 
программ. 

* Она способна интерпретировать входные и выходные данные только в том смысле, что ''х'' является входом, a f : x - это выход.

* Если имеется слабое множество примитивных функций и функциональных форм, то может оказаться, что удается выразить не всякую вычислимую функцию. Система FP не может вычислять программу, потому что выражения функций не являются объектами. 

*Нельзя также описывать новые функциональные формы в рамках системы FP. (Оба этих ограничения устраняются в формальных системах функционального программирования (FFP), в которых объекты "представляют"функции.) Так, ни одна система FP не может включать функцию apply, такую, что apply  :  <esc><x,y> = x  :  y </esc>потому что в левой части x - это объект, а в правой части x - это функция. 

Основное ограничение системы FP состоит в том, что они исторически нечувствительны. Поэтому их следует как-то расширить, прежде чем они смогут начать приносить практическую пользу. . 


===Преимущества системы FP===
Системы FP значительно проще, чем традиционные языки и языки, основанные на лямбда-исчислении, в основном по той причине, что в них употребляется только самая простая фиксированная система именования (именование функции в ее определении) с простым фиксированным правилом подстановки функции вместо ее имени. Поэтому в них отсутствует сложность как систем именования в традиционных языках, так и правил подстановок из лямбда-исчисления. Системы FP допускают определение различных систем именования для разных целей. От них не требуется сложность, поскольку многие программы могут работать совсем без них. Более существенно, что эти системы интерпретируют имена как функции, которые-могут комбинироваться с другими функциями и не требуют специального подхода. Они позволяют развивать методы более высокого уровня, пригодные для размышлений над программами, манипулирования ими и их написания. 
 
 
  
